from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin


class AuthMiddleware(MiddlewareMixin):
    # 重写MiddlewareMixin里的process_request方法: url入口
    # 可以在中间件这里先赋值request.xxx= xxxx, 以后后边用到的变量就可以直接取值，等于是起了一个全局变量
    def process_request(self, request):  # url访问服务器之前要先走中间件这里,其实内部执行的是__call__方法
        # 先过滤不用登录就可以访问的url
        # 有些静态文件如：http://xxxx/static/1.png,有些版本也会阻拦，这里需要也可以放行
        # print('我的:', request.path.split('/')[1])
        if request.path.split('/')[1] in ['login',
                                          'logout',
                                          'reward',
                                          'forgot',
                                          'register',
                                          'image',
                                          'send',
                                          'iot',
                                          'setup',
                                          '']:  # 放行
            return
        info_dict = request.session.get('user_id')

        if info_dict:  # 已经登录，继续后边的事情
            return
        return redirect('/login/')  # 未登录，返回登录界面

    # def process_response(self, request, response):  # 服务器返回浏览器数据之前也要走中间件这里出去,其实内部执行的是__call__方法
    #     # print('process_response:', response)
    #     return response

    # def process_view(self, request, view_func, view_args, view_kwargs):  # django 内部写死的，如果想用就打开，就会自动执行这个函数
    #     第一次每次执行完中间件后(进行路由匹配),会再次回到中间件开头来执行这个process_view函数,完了以后才真正去执行我们自己的视图函数
    #     pass

    # def process_exception(self, request, exception):  # django内部写好的函数，想用就打开
    # 视图函数，抛出异常
    # print('异常了', exception)

    # def process_template_response(self, request, response):
    # 在视图函数中，return的是TemplateResponse对象时被调用：其实是把render()分成两步走了，所以这个用的很少，几乎不用
    # response.render()
    # return response
